home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / kaliosisquantrum / morb / oo.s < prev    next >
Text File  |  1998-01-12  |  8KB  |  445 lines

  1. *
  2. * CdBSian Obviously Universal & Interactive Nonsense (COUIN)
  3. * (Absurdité CdBSienne Manifestement Universelle et Interactive)
  4. * ©1997-1998, CdBS Software (MORB)
  5. * Object oriented support routines
  6. * $Id: OO.s 0.11 1998/01/04 16:37:20 MORB Exp MORB $
  7. *
  8.  
  9. _OOPool:
  10.      ds.l      1
  11. _ObjectCollector:
  12.      ds.l      1
  13.  
  14. ;fs "_OOInit"
  15. _OOInit:
  16.      move.l    (AbsExecBase).w,a6
  17.      move.l    #MEMF_CLEAR,d0
  18.      move.l    #1024,d1
  19.      move.l    #512,d2
  20.      CALL      CreatePool
  21.      move.l    d0,_OOPool
  22.      beq.s     .Fail
  23.  
  24.      lea       _RootClass,a0
  25.      sub.l     a1,a1
  26.      bsr       _NewObject
  27.      move.l    d0,_ObjectCollector
  28. .Fail:
  29.      rts
  30. ;fe
  31. ;fs "_OOCleanUp"
  32. _OOCleanUp:
  33.      move.l    _ObjectCollector,a0
  34.      bsr       _DisposeObject
  35.  
  36.      move.l    _OOPool(pc),a0
  37.      beq.s     .Ok
  38.      move.l    (AbsExecBase).w,a6
  39.      CALL      DeletePool
  40. .Ok:
  41.      rts
  42. ;fe
  43.  
  44. ;fs "_InitClass"
  45. _InitClass:        ; a0=Class
  46.      movem.l   a0/a3-a5,-(a7)
  47.  
  48.      move.l    a0,a5
  49.      move.l    ci_SuperClass(a5),a0
  50.      tst.l     (a0)
  51.      bne.s     .SuperClassOk
  52.      bsr.s     _InitClass
  53. .SuperClassOk:
  54.  
  55.      move.l    ci_FuncTable(a5),a1
  56.      moveq     #0,d7
  57. .CountFuncs:
  58.      tst.l     (a1)+
  59.      beq.s     .CFDone
  60.      addq.l    #6,d7
  61.      bra.s     .CountFuncs
  62. .CFDone:
  63.  
  64.      move.l    d7,d1
  65.      add.l     ci_JumpTable_Size(a0),d1
  66.      move.l    d1,ci_JumpTable_Size(a5)
  67.      move.l    d7,d0
  68.      addq.l    #4,d0
  69.      move.l    d0,d1
  70.      add.l     ci_BaseOffset(a0),d1
  71.      move.l    d1,ci_BaseOffset(a5)
  72.  
  73.      move.l    ci_DataLength(a5),d1
  74.      move.l    d1,d2
  75.      add.l     ci_Data_Size(a0),d2
  76.      move.l    d2,ci_Data_Size(a5)
  77.  
  78.      add.l     d1,d0
  79.      addq.l    #4,d0
  80.      add.l     ci_InstanceSize(a0),d0
  81.      move.l    d0,ci_InstanceSize(a5)
  82.      move.l    a0,a2
  83.  
  84.      move.l    (AbsExecBase).w,a6
  85.      move.l    _OOPool(pc),a0
  86.      CALL      AllocPooled
  87.      move.l    d0,ci_ClassObj(a5)
  88.      beq.s     .Fail
  89.  
  90.      move.l    ci_FuncTable(a5),a0
  91.      move.l    d0,a1
  92. .MakeJumpTable:
  93.      move.l    (a0)+,d0
  94.      beq.s     .MJTDone
  95.      move.w    #$4ef9,(a1)+
  96.      move.l    d0,(a1)+
  97.      bra.s     .MakeJumpTable
  98. .MJTDone:
  99.  
  100.      move.l    ci_ClassObj(a2),a3
  101.      move.l    a3,a0
  102.      move.l    a1,a4
  103.      move.l    ci_JumpTable_Size(a2),d2
  104.      move.l    d2,d0
  105.      CALL      CopyMem
  106.  
  107.      move.l    a4,d0
  108.      subq.l    #6,d0
  109.      sub.l     ci_ClassObj(a5),d0
  110.      add.l     d2,a3
  111.      add.l     d2,a4
  112.      move.l    d0,(a4)+
  113.  
  114.      move.l    ci_Generation(a2),d2
  115.      move.l    d2,d0
  116.      addq.l    #1,d0
  117.      move.l    d0,ci_Generation(a5)
  118.  
  119.      move.l    d2,d0
  120. .CpyFuncTable:
  121.      move.l    (a3)+,d1
  122.      add.l     d7,d1
  123.      move.l    d1,(a4)+
  124.      dbf       d0,.CpyFuncTable
  125.  
  126.      addq.l    #8,a4
  127.      move.l    a5,(a4)+
  128.  
  129.      lea       12(a3),a3
  130.      addq.l    #8,d7
  131. .CpyDataTable:
  132.      move.l    (a3)+,d1
  133.      add.l     d7,d1
  134.      move.l    d1,(a4)+
  135.      dbf       d2,.CpyDataTable
  136.  
  137.      move.l    a4,d1
  138.      addq.l    #4,d1
  139.      sub.l     (a5),d1
  140.      move.l    ci_Data_Size(a2),d0
  141.      add.l     d0,d1
  142.      move.l    d1,(a4)+
  143.  
  144.      move.l    a4,a1
  145.      add.l     d0,a4
  146.      move.l    a3,a0
  147.      CALL      CopyMem
  148.  
  149.      move.l    a4,a1
  150.      move.l    ci_Datas(a5),a0
  151.      move.l    ci_DataLength(a5),d0
  152.      CALL      CopyMem
  153.  
  154.      move.l    ci_InitCode(a5),d0
  155.      beq.s     .Fail
  156.      move.l    a5,a0
  157.      move.l    (a0),a1
  158.      move.l    a1,a2
  159.      add.l     ci_BaseOffset(a0),a2
  160.      move.l    d0,a5
  161.      jsr       (a5)
  162.  
  163. .Fail:
  164.      movem.l   (a7)+,a0/a3-a5
  165.      rts
  166. ;fe
  167. ;fs "_SetMethod"
  168. _SetMethod:        ; d0=Method id a0=Class a1=NewFunc
  169.      movem.l   d2/a0-3,-(a7)
  170.  
  171.      move.l    (a0),a2
  172.      move.l    a2,a3
  173.      add.l     ci_BaseOffset(a0),a3
  174.      add.l     -4(a3,d0.w),a2
  175.      swap      d0
  176.      addq.w    #2,d0
  177.      move.l    (a2,d0.w),d2
  178.      move.l    a1,(a2,d0.w)
  179.  
  180.      move.l    (AbsExecBase).w,a6
  181.      CALL      CacheClearU
  182.      move.l    d2,d0
  183.  
  184.      movem.l   (a7)+,d2/a0-3
  185.      rts
  186. ;fe
  187.  
  188. ;fs "_NewObject"
  189. _NewObject:        ; a0=Class a1=SetupCode a5=SetupData
  190.      movem.l   d2-3/d7/a2-4/a6,-(a7)
  191.  
  192.      move.l    a0,a3
  193.      move.l    a1,a4
  194.  
  195.      tst.l     (a0)
  196.      bne.s     .ClassOk
  197.      bsr.s     _InitClass
  198. .ClassOk:
  199.  
  200.      move.l    (AbsExecBase).w,a6
  201.      move.l    ci_InstanceSize(a3),d2
  202.      move.l    d2,d0
  203.      move.l    #MEMF_CLEAR,d1
  204.      CALL      AllocVec
  205.      move.l    d0,d7
  206.      beq.s     .Fail
  207.  
  208.      move.l    d0,a2
  209.      move.l    (a3),a0
  210.      move.l    a2,a1
  211.      move.l    ci_JumpTable_Size(a3),d2
  212.      move.l    d2,d0
  213.      CALL      CopyMem
  214.      CALL      CacheClearU
  215.  
  216.      add.l     d2,a2
  217.      move.l    (a3),a0
  218.      add.l     d2,a0
  219.      move.l    ci_Generation(a3),d3
  220.      move.l    d3,d0
  221. .FuncTableLoop:
  222.      move.l    (a0)+,d1
  223.      add.l     d7,d1
  224.      move.l    d1,(a2)+
  225.      dbf       d0,.FuncTableLoop
  226.  
  227.      addq.l    #8,a2
  228.      move.l    a3,(a2)+
  229.      lea       12(a0),a0
  230.  
  231. .DataTableLoop:
  232.      move.l    (a0)+,d1
  233.      add.l     d7,d1
  234.      move.l    d1,(a2)+
  235.      dbf       d3,.DataTableLoop
  236.  
  237.      move.l    a2,a1
  238.      move.l    ci_Data_Size(a3),d0
  239.      CALL      CopyMem
  240.  
  241.      move.l    d7,a2
  242.      add.l     ci_BaseOffset(a3),a2
  243.  
  244.      move.l    a4,d0
  245.      beq.s     .NoInit
  246.      move.l    a2,a0
  247.      jsr       (a4)
  248. .NoInit:
  249.  
  250.      DOMTDI    MTD_New,a2
  251.      move.l    a2,d0
  252.  
  253. .Fail:
  254.      movem.l   (a7)+,d2-3/d7/a2-4/a6
  255.      rts
  256. ;fe
  257. ;fs "_DisposeObject"
  258. _DisposeObject:    ; a0=Object
  259.      move.l    d0,d0
  260.      beq.s     .Ok
  261.      movem.l   a2/a6,-(a7)
  262.  
  263.      move.l    a0,a2
  264.      DOMTDI    MTD_Dispose,a0
  265.  
  266.      move.l    (AbsExecBase).w,a6
  267.      move.l    a2,a1
  268.      move.l    8(a1),a0
  269.      sub.l     ci_BaseOffset(a0),a1
  270.      CALL      FreeVec
  271.  
  272.      movem.l   (a7)+,a2/a6
  273. .Ok:
  274.      rts
  275. ;fe
  276.  
  277. ;fs "_CreateObjectTree"
  278. _CreateObjectTree: ; a0=ObjTree
  279.      movem.l   a2/a5-6,-(a7)
  280.  
  281.      lea       4(a0),a5
  282.      sub.l     a6,a6
  283.      bsr.s     .ObjTree
  284.      tst.l     d0
  285.      beq.s     .Fail
  286.  
  287. .COTDone:
  288.      movem.l   (a7)+,a2/a5-6
  289.      rts
  290.  
  291. .Fail:
  292.      move.l    d0,a0
  293.      bsr.s     _DisposeObject
  294.      moveq     #0,d0
  295.      bra.s     .COTDone
  296.  
  297. .ObjTree:          ; a5=ObjTree a6=Parent
  298.      move.l    (a5)+,a0
  299.      lea       .ObjInit,a1
  300.      bsr.s     _NewObject
  301.      tst.l     d0
  302.      beq.s     .Ok
  303.  
  304.      move.l    d0,a2
  305.      move.l    a6,d1
  306.      beq.s     .Loop
  307.      DOMTDI    MTD_AddMember,a6
  308.  
  309. .Loop:
  310.      move.l    (a5)+,d0
  311.      bne.s     .Done
  312.  
  313.      movem.l   a2/a6,-(a7)
  314.      move.l    a2,a6
  315.      bsr.s     .ObjTree
  316.      movem.l   (a7)+,a2/a6
  317.      tst.l     d0
  318.      bne.s     .Loop
  319.  
  320. .Ok:
  321.      rts
  322.  
  323. .Done:
  324.      addq.l    #1,d0
  325.      beq.s     .DontStore
  326.      move.l    (a5)+,a0
  327.      move.l    a2,(a0)
  328. .DontStore:
  329.  
  330.      move.l    a2,d0
  331.      rts
  332.  
  333. .ObjInit:
  334.      move.l    a0,a1
  335.  
  336. .DatLoop:
  337.      move.l    (a5)+,d0
  338.      beq.s     .OIDone
  339.      cmp.l     #OBJ_End,d0
  340.      beq.s     .OIDone
  341.      cmp.l     #OBJ_Store,d0
  342.      beq.s     .OIDone
  343.  
  344.      SDATAL    (a5)+,d0,a1
  345.      bra.s     .DatLoop
  346.  
  347. .OIDone:
  348.      subq.l    #4,a5
  349.      rts
  350. ;fe
  351.  
  352. ;fs "RootClass"
  353. _RootClass:
  354.      dc.l      RootClassObj
  355.      dc.l      0
  356.      dc.l      RootClassObjEnd-RootClassObj
  357.      dc.l      RootClassBase-RootClassObj
  358.      dc.l      RootClassBase-RootClassObj-4
  359.      dc.l      RootClassObjEnd-RootClassData
  360.      dc.l      0
  361.      dc.l      RootClassObjEnd-RootClassData
  362.      dc.l      0
  363.      dc.l      0
  364.      dc.l      0
  365.      dc.l      0
  366.  
  367. RootClassObj:
  368.      dc.w      $4ef9
  369.      dc.l      RCRemove
  370.      dc.w      $4ef9
  371.      dc.l      RCAdd
  372.      dc.w      $4ef9
  373.      dc.l      RCAddM
  374.      dc.w      $4ef9
  375.      dc.l      RCDispose
  376. RCJmpTbl:
  377.      dc.w      $4ef9
  378.      dc.l      RCNew
  379.  
  380.      dc.l      RCJmpTbl-RootClassObj
  381. RootClassBase:
  382.      dc.l      0,0
  383.      dc.l      _RootClass
  384.      dc.l      RootClassData-RootClassObj
  385. RootClassData:
  386.      ds.b      MLH_SIZE
  387.      dc.l      0
  388. RootClassObjEnd:
  389.      even
  390.  
  391. RCNew:
  392.      LBLOCKEAI RootClass_ID,a0,a1
  393.      NEWLIST   a1
  394.      rts
  395.  
  396. RCDispose:
  397.      movem.l   d2/a2,-(a7)
  398.      move.l    a0,a2
  399.  
  400.      LBLOCKEAI RootClass_ID,a0,a0
  401.      move.l    (a0),a0
  402. .Loop:
  403.      move.l    (a0),d2
  404.      beq.s     .Done
  405.      bsr.s     _DisposeObject
  406.      move.l    d2,a0
  407.      bra.s     .Loop
  408. .Done:
  409.  
  410.      tst.l     (a2)
  411.      beq.s     .Ok
  412.      move.l    a2,a1
  413.      REMOVE
  414. .Ok:
  415.  
  416.      movem.l   (a7)+,d2/a2
  417.      rts
  418.  
  419. RCAddM:  ; a2=Object to add
  420.      LBLOCKEAI RootClass_ID,a2,a1
  421.      move.l    a0,root_DTA_Parent(a1)
  422.  
  423.      move.l    a2,a1
  424.      LBLOCKEAI RootClass_ID,a0,a0
  425.      ADDTAIL
  426.      rts
  427.  
  428. RCAdd:   ; a2=Object to add to
  429.      LBLOCKEAI RootClass_ID,a0,a1
  430.      move.l    a2,root_DTA_Parent(a1)
  431.  
  432.      move.l    a0,a1
  433.      LBLOCKEAI RootClass_ID,a2,a0
  434.      ADDTAIL
  435.      rts
  436.  
  437. RCRemove:
  438.      LBLOCKEAI RootClass_ID,a0,a1
  439.      clr.l     root_DTA_Parent(a1)
  440.  
  441.      move.l    a0,a1
  442.      REMOVE
  443.      rts
  444. ;fe
  445.